home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / usr (gcc 1.37 libs) / mac / getargs.c < prev    next >
Text File  |  1993-12-14  |  2KB  |  137 lines

  1. #include "crtlocal.h"
  2. #include <Dialogs.h>
  3.  
  4. enum {
  5.     cmdLine = 3, labelLine
  6. };
  7.  
  8. static struct {
  9.     short            count;
  10.     struct {
  11.         Handle            h;
  12.         Rect            box;
  13.         char            kind;
  14.     }                item[13];
  15. } itemList = { 4,
  16.  
  17.         /*  OK  */
  18.     0, { 76, 115, 96, 175 }, ctrlItem+btnCtrl,
  19.  
  20.         /*  Cancel  */
  21.     0, { 76, 225, 96, 285 }, ctrlItem+btnCtrl,
  22.     
  23.         /*  command line  */
  24.     0, { 41, 34, 57, 376 }, editText+itemDisable,
  25.         
  26.         /*  "Command Line:"  */
  27.     0, { 14, 20, 30, 170 }, statText+itemDisable,
  28. };
  29.  
  30. /*
  31.  *  ditem - return item handle
  32.  *
  33.  */
  34.  
  35. static DialogPtr dp;
  36.  
  37. static Handle ditem(int);
  38.  
  39. static Handle ditem(int i)
  40. {
  41.     short kind;
  42.     Handle item;
  43.     Rect box;
  44.     
  45.     GetDItem(dp, i, &kind, &item, &box);
  46.     return(item);
  47. }
  48.  
  49. #pragma parameter __A0 myPtrToHand(__A0,__D0)
  50. pascal Handle myPtrToHand(const void *srcPtr, long size) = 0xA9E3;
  51.  
  52. enum { NARGS = 255};
  53.  
  54. static int argc;
  55. static unsigned char **argv;
  56. static Str255 argbuf;
  57. static char *argvec[NARGS+1];
  58.  
  59. static void parse(char *s, char *t)
  60.     {
  61.     int c = *s++, quote = 0;
  62.     s[(unsigned char)c] = 0;
  63.     while (c = *s++) {
  64.         if (c == ' ')
  65.             continue;
  66.         if (argc < NARGS)
  67.             argvec[argc++] = t;
  68.         do {
  69.             if (c == '\\' && *s)
  70.                 c = *s++;
  71.             else if (c == '"' || c == '\'') {
  72.                 if (!quote) {
  73.                     quote = c;
  74.                     continue;
  75.                 }
  76.                 if (c == quote) {
  77.                     quote = 0;
  78.                     continue;
  79.                 }
  80.             }
  81.             *t++ = c;
  82.         } while (*s && ((c = *s++) != ' ' || quote));
  83.         *t++ = 0;
  84.     }
  85.     argvec[argc] = 0;
  86. }
  87.  
  88. static void getargs(void)
  89.    {
  90.     short i;
  91.     Rect bounds = { 60, 51, 170, 461 };
  92.     Handle items = myPtrToHand(&itemList,sizeof(itemList));
  93.     dp = NewDialog(0, &bounds, "\p line", 0, 1, (WindowPtr) -1, 0, 0, items);
  94.     SetCTitle((ControlHandle)ditem(ok), "\pOK");
  95.     SetCTitle((ControlHandle)ditem(cancel), "\pCancel");
  96.     SetIText(ditem(labelLine), "\pCommand Line:");
  97.     SetIText(ditem(cmdLine), "\p" );
  98.     SelIText(dp, cmdLine, 9999, 9999);
  99.     ShowWindow(dp);
  100.     SetCursor(&qd.arrow);    
  101.     do {
  102.         ModalDialog(0, &i);
  103.         if (i == cancel) ExitToShell();
  104.         }
  105.     while (i != ok);
  106.     GetIText(ditem(cmdLine), (void *)argbuf);
  107.     DisposDialog(dp);
  108.     parse((char *)(&argbuf), (char *)(&argbuf));
  109.     }
  110.  
  111. #ifdef THINK_C
  112. void crt_getargs(void);
  113.  
  114. main()
  115.     {
  116.     crt_getargs();
  117.     }
  118.  
  119. #define main _main
  120. #endif
  121.     
  122. void crt_getargs(void)
  123.     {
  124.     if (!qd.thePort)
  125.         {
  126.         InitGraf(&qd.thePort);
  127.         InitFonts();
  128.         InitWindows();
  129.         InitMenus();
  130.         TEInit();
  131.         InitCursor();
  132.         InitDialogs(0);
  133.         }
  134.     getargs();
  135.     exit(main(argc, argvec));
  136.     }
  137.